package keer.httpinterface.proxy;
import keer.httpinterface.http.HttpResponse;
import keer.httpinterface.utils.IOUtils;
import keer.httpinterface.utils.StringUtils;

/**
 * TextContentResponseConverter类继承自ResponseConverter，专门用于处理文本类型的响应内容转换
 * 它重写了父类的convert方法以处理特定的文本内容，并将其转换为指定的类型
 * @see ResponseConverter
 * @see HttpResponse
 *
 * @author Keer
 * @since 1.0.0
 */
public class TextContentResponseConverter extends ResponseConverter {

    /**
     * 根据HTTP响应内容和指定的结果类型，转换响应内容为相应的对象
     *
     * @param response HTTP响应对象，包含响应头、状态和内容
     * @param resultType 需要转换成的结果类型
     * @return 根据resultType转换后的对象，如果类型不匹配且无法转换，则调用convertString方法尝试进一步转换
     * @throws Exception 如果转换过程中发生错误，例如无法解析文本内容为指定类型
     */
    @Override
    public final Object convert0(HttpResponse response, Class<?> resultType) throws Exception {
        // 获取响应内容的字符集
        String charset = response.getHeaders().charset();
        // 根据字符集读取响应内容为字符串
        String text = IOUtils.readText(response.getContent(), charset);

        // 根据结果类型，将文本内容转换为相应的类型
        if (resultType.equals(String.class)) {
            return text;
        } else if (resultType.equals(Void.class)) {
            return null;
        } else if (resultType.equals(int.class) ||
                resultType.equals(Integer.class)) {
            return StringUtils.toInt(text, null);
        } else if (resultType.equals(long.class) ||
                resultType.equals(Long.class)) {
            return StringUtils.toLong(text, null);
        } else if (resultType.equals(double.class) ||
                resultType.equals(Double.class)) {
            return StringUtils.toDouble(text, null);
        } else if (resultType.equals(float.class) ||
                resultType.equals(Float.class)) {
            return StringUtils.toFloat(text, null);
        } else if (resultType.equals(short.class) ||
                resultType.equals(Short.class)) {
            return StringUtils.toShort(text, null);
        } else if (resultType.equals(boolean.class) ||
                resultType.equals(Boolean.class)) {
            return StringUtils.toBoolean(text, null);
        }

        // 如果以上类型都不匹配，则调用convertString方法尝试转换
        return convertString(text, resultType);
    }

    /**
     * 默认的字符串到其他类型转换方法，当标准类型转换不适用时调用
     * 此方法在当前实现中仅返回原始文本，但提供了一个扩展点
     *
     * @param text 需要转换的文本内容
     * @param resultType 需要转换成的结果类型
     * @return 默认情况下返回原始文本，不进行转换
     * @throws Exception 如果转换过程中有特殊需求，可能抛出异常
     */
    protected Object convertString(String text, Class<?> resultType) throws Exception {
        return text;
    }

    /**
     * 返回处理的响应内容类型
     *
     * @return 总是返回"text/plain"，表示处理纯文本类型的响应，子类可根据实际的响应Content-Type覆盖此方法
     */
    @Override
    protected String contentType() {
        return "text/plain";
    }

}
